Transformer-XL
Transformer-XL
1. 개요
Transformer-XL(Extra Long Transformer)은 기존 Transformer 모델의 고정된 컨텍스트 길이 제한을 극복하기 위해 제안된 대규모 언어 모델 아키텍처로, 세그먼트 수준의 재귀 메커니즘을 통해 매우 긴 의존성(Long-term dependency)을 학습할 수 있도록 설계된 모델이다.
기존의 Vanilla Transformer는 입력 시퀀스를 고정된 길이의 세그먼트로 나누어 처리한다. 이 방식은 두 가지 주요 한계를 가진다. 첫째, 세그먼트 경계에서 정보가 단절되는 컨텍스트 단편화(Context Fragmentation) 현상이 발생하여 모델이 세그먼트 간의 관계를 학습하기 어렵다. 둘째, 추론 시 이전 세그먼트의 정보를 활용하지 못하고 매번 전체 컨텍스트를 다시 계산해야 하므로 계산 효율성이 떨어진다. Transformer-XL은 이를 해결하여 이론적으로 훨씬 더 긴 시퀀스를 처리할 수 있게 한다.
2. 핵심 메커니즘
2.1 세그먼트 수준 재귀 (Segment-Level Recurrence)
Transformer-XL의 핵심은 이전 세그먼트의 은닉 상태(Hidden State)를 버리지 않고 캐시(Cache)에 저장하여 다음 세그먼트의 계산 시 재사용하는 것이다.
- 작동 방식: 현재 세그먼트 $t$를 처리할 때, 이전 세그먼트 $t-1$에서 계산된 은닉 상태를 고정된 값으로 가져와 현재 층의 입력값에 결합(Concatenate)한다.
- 효과: 각 층이 이전 층의 캐시된 상태를 참조함으로써 정보가 층을 타고 역방향으로 전파된다. 결과적으로 모델이 참조할 수 있는 유효 컨텍스트 길이는 $\text{층의 깊이}(N) \times \text{세그먼트 길이}(L)$만큼 확장되어, 매우 먼 과거의 정보까지 활용할 수 있게 된다.
2.2 상대적 위치 인코딩 (Relative Positional Encoding)
절대적 위치 인코딩(Absolute Positional Encoding)을 사용하면 세그먼트가 바뀌어도 위치 인덱스가 동일하게 반복되므로, 모델이 서로 다른 세그먼트의 동일 위치를 구분하지 못하는 문제가 발생한다. Transformer-XL은 이를 해결하기 위해 상대적 위치 인코딩을 도입했다.
- 원리: 토큰의 절대적인 위치 대신, 쿼리(Query) 토큰과 키(Key) 토큰 사이의 상대적인 거리만을 학습 가능한 파라미터로 인코딩한다.
| 비교 항목 | 절대적 위치 인코딩 (Vanilla Transformer) | 상대적 위치 인코딩 (Transformer-XL) |
|---|---|---|
| 정의 방식 | 각 위치(0, 1, 2...)에 고유한 벡터 할당 | 두 토큰 간의 거리($i-j$)에 벡터 할당 |
| 세그먼트 전이 | 세그먼트 변경 시 위치 정보가 중복됨 | 세그먼트가 바뀌어도 상대적 거리는 유지됨 |
| 일반화 능력 | 학습 때보다 긴 시퀀스 처리 시 성능 저하 | 학습하지 않은 길이의 시퀀스에도 유연하게 대응 |
| 계산 방식 | 입력 임베딩에 직접 더함 | 어텐션 점수(Attention Score) 계산 시 추가 |
3. 작동 원리 및 구조
3.1 데이터 흐름 및 메모리 캐싱
데이터는 다음과 같은 단계로 처리된다. 1. 캐싱: 세그먼트 $S_{t-1}$의 연산 결과인 은닉 상태 $h_{t-1}$을 메모리에 저장한다. 2. 결합: 세그먼트 $S_t$의 입력값에 $h_{t-1}$을 접두사(Prefix)로 붙여 확장된 컨텍스트를 형성한다. 3. 어텐션: 확장된 컨텍스트 내에서 상대적 위치 인코딩을 적용하여 셀프 어텐션을 수행한다. 4. 업데이트: 현재 세그먼트의 결과물을 다시 캐시에 저장하여 다음 세그먼트 $S_{t+1}$이 사용할 수 있게 한다.
3.2 개념 코드 (PyTorch 스타일)
아래는 Transformer-XL의 캐싱 로직을 단순화한 개념 코드이다.
import torch
import torch.nn as nn
class TransformerXLCell(nn.Module):
def __init__(self, d_model, mem_len):
super().__init__()
self.d_model = d_model
self.mem_len = mem_len
self.attention = RelativeAttention(d_model)
self.layer_norm = nn.LayerNorm(d_model)
def forward(self, x, mems=None):
# x: [batch, seq_len, d_model]
# mems: [batch, mem_len, d_model] (이전 세그먼트의 은닉 상태)
if mems is not None:
# 이전 세그먼트의 메모리를 현재 입력과 결합
# concat_x: [batch, mem_len + seq_len, d_model]
concat_x = torch.cat([mems, x], dim=1)
else:
concat_x = x
# 상대적 위치 인코딩이 적용된 어텐션 수행
attn_out = self.attention(concat_x)
# 현재 세그먼트에 해당하는 출력만 추출
out = attn_out[:, -x.size(1):, :]
# 메모리 효율을 위해 최신 mem_len개 토큰의 은닉 상태만 슬라이싱하여 저장
# new_mems: [batch, mem_len, d_model]
new_mems = concat_x[:, -self.mem_len:, :]
return self.layer_norm(out), new_mems
4. 수식 및 다이어그램
4.1 어텐션 수식
Transformer-XL의 상대적 어텐션 점수 $a_{i,j}$는 단순히 위치 벡터를 더하는 것이 아니라, 콘텐츠와 위치의 상호작용을 4가지 항으로 분리하여 계산한다.
$$ a_{i,j} = \frac{(q_i + u)^T (k_j + v_{i-j})}{\sqrt{d}} = \frac{q_i^T k_j + q_i^T v_{i-j} + u^T k_j + u^T v_{i-j}}{\sqrt{d}} $$
각 항의 의미는 다음과 같다: 1. $q_i^T k_j$ (Content-Content): 쿼리 토큰과 키 토큰의 내용 간 유사도. 2. $q_i^T v_{i-j}$ (Content-Position): 쿼리 토큰의 내용과 상대적 거리 간의 관계. 3. $u^T k_j$ (Position-Content): 쿼리의 고정된 위치 정보와 키 토큰 내용 간의 관계. 4. $u^T v_{i-j}$ (Position-Position): 쿼리의 고정된 위치 정보와 상대적 거리 간의 관계.
여기서 $u$는 쿼리의 콘텐츠 기반 위치 임베딩이며, $v_{i-j}$는 상대적 거리 $i-j$에 해당하는 학습 가능한 위치 임베딩이다.
4.2 전체 데이터 흐름 구조도
graph TD
subgraph "Segment t-1 (Previous)"
S1[Input Segment t-1] --> L1_1[Layer 1]
L1_1 --> L1_2[Layer 2]
L1_2 --> L1_N[Layer N]
end
subgraph "Memory Cache"
M1[Layer 1 Cache]
M2[Layer 2 Cache]
MN[Layer N Cache]
end
L1_1 -.-> M1
L1_2 -.-> M2
L1_N -.-> MN
subgraph "Segment t (Current)"
S2[Input Segment t] --> C1[Concat with M1]
C1 --> L2_1[Layer 1]
L2_1 --> C2[Concat with M2]
C2 --> L2_2[Layer 2]
L2_2 --> CN[Concat with MN]
CN --> L2_N[Layer N]
L2_N --> Out[Final Output]
end
M1 --> C1
M2 --> C2
MN --> CN
5. 성능 및 평가
5.1 벤치마크 결과
Transformer-XL은 WikiText-103과 enwiki8 데이터셋에서 기존 모델 대비 압도적인 Perplexity(PPL) 감소를 보였다.
| 모델 | WikiText-103 PPL $\downarrow$ | enwiki8 PPL $\downarrow$ | 최대 참조 길이 |
|---|---|---|---|
| Vanilla Transformer | 22.1 | 43.2 | $L$ (세그먼트 길이) |
| Transformer-XL | 18.4 | 35.1 | $N \times L$ (층 $\times$ 길이) |
- 컨텍스트 확장: Vanilla Transformer보다 최대 450% 더 긴 의존성을 학습할 수 있음이 증명되었다.
- 효율성: 추론 시 이전 상태를 재사용하므로, 동일한 컨텍스트 길이를 유지하기 위해 전체 시퀀스를 다시 계산하는 방식보다 속도가 수십 배 빠르다.
5.2 시간 및 공간 복잡도
- 시간 복잡도:
- 학습 시: $O(L^2 \cdot d)$ (여기서 $L$은 세그먼트 길이, $d$는 모델 차원). 세그먼트 단위로 처리하므로 단일 세그먼트 내에서는 기존 Transformer와 동일하다.
- 추론 시: $O(L \cdot d)$ (캐싱 덕분에 토큰당 계산량이 일정하게 유지됨).
- 공간 복잡도: $O(N \cdot L \cdot d)$ (여기서 $N$은 층의 개수). 각 층마다 이전 세그먼트의 은닉 상태를 저장해야 하므로 메모리 사용량이 증가한다.
6. 활용 사례 및 영향
6.1 주요 활용 분야
- 장문 텍스트 생성: 소설, 논문 등 문맥 유지가 중요한 긴 글 생성 시 일관성을 유지하는 데 탁월하다.
- 문서 요약: 문서 전체의 흐름을 파악해야 하는 추상적 요약(Abstractive Summarization) 작업에 활용된다.
6.2 후속 모델에 미친 영향
Transformer-XL의 아이디어는 이후 다양한 모델로 계승되었다. - XLNet: Transformer-XL의 재귀 메커니즘을 기반으로, BERT의 양방향 학습 능력을 결합한 Permutation Language Modeling(PLM) 방식을 도입했다. - Longformer / BigBird: 희소 어텐션(Sparse Attention) 기법과 결합하여 더 효율적인 장문 처리 모델들이 등장하는 기반이 되었다.
7. 하이퍼파라미터 설정 가이드
Transformer-XL을 구현하거나 튜닝할 때 고려해야 할 주요 설정값은 다음과 같다.
| 파라미터 | 권장 설정 범위 | 설명 | 비고 |
|---|---|---|---|
mem_len |
$L$ (세그먼트 길이)와 동일 | 캐시에 저장할 이전 상태의 길이 | 너무 길면 메모리 부족 발생 |
d_model |
512, 768, 1024 | 모델의 은닉 층 차원 | 모델 용량과 성능의 트레이드오프 |
n_layer |
12, 18, 24 | Transformer 블록의 적층 수 | 층이 깊을수록 더 먼 과거의 정보를 참조 가능 |
dropout |
0.1 $\sim$ 0.3 | 과적합 방지를 위한 드롭아웃 비율 | 데이터셋 크기에 따라 조절 |
learning_rate |
$10^{-4} \sim 10^{-5}$ | Adam optimizer 기반 학습률 | Warm-up 스케줄러 사용 권장 |
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.